#pragma once

#include "portmacro.h"

// 初始化节点的拥有者
#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )		\
	( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) )
// 获取节点的拥有者
#define listGET_LIST_ITEM_OWNER( pxListItem )				\
	( ( pxListItem )->pvOwner )
// 初始化节点排序辅助值
#define listSET_LIST_ITEM_VALUE( pxListItem, xValue )		\
	( ( pxListItem )->xItemValue = ( xValue ) )
// 获取节点排序辅助值
#define listGET_LIST_ITEM_VALUE( pxListItem )				\
	( ( pxListItem )->xItemValue )
// 获取链表根节点计数器的值
#define listGET_ITEMVALUE_OF_HEAD_ENTRY( pxList )			\
	( ( ( pxList )->xListEnd.pxNext )->xItemValue )
// 获取链表的入口节点
#define listGET_HEAD_ENTRY( pxList )						\
	( ( ( pxList )->xListEnd.pxNext ) )
// 获取节点的下一个节点
#define listGET_NEXT( pxListItem )							\
	( ( pxListItem )->pxNext )
// 获取链表的最后一个节点
#define listGET_END_MARKER( pxList )						\
	( ( ListItem_t const* ) ( &( ( pxList )->xListEnd ) ) )
// 判断链表是否为空
#define listLIST_IS_EMPTY( pxList )							\
	( ( BaseType_t ) ( ( pxList )->uxNumberOfItem == ( UBaseType_t ) 0 ) )
// 获取链表的节点数
#define listCURRENT_LIST_LENGTH( pxList )					\
	( ( pxList )->uxNumberOfItem )
// 获取链表第一个节点的OWNER，即TCB
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )	{
	List_t * const pxConstList = ( pxList );
	//节点索引指向链表第一个节点
	pxConstList->pxIndex = pxConstList->pxIndex->pxNext;
	//这个操作有什么作用
	if((void*)pxConstList->pxIndex == (void*)&(pxConstList->xListEnd)){
		pxConstList->pxIndex = pxConstList->pxIndex->pxNext;
	}
	// 获取节点的OWNER（TCB）
	pxTCB = pxConstList->pxIndex->pvOwner;
}

struct xLIST_ITEM
{
	TickType_t xItemValue;    /*辅助值，用于节点排序*/
	struct xLIST_ITEM *pxNext;
	struct xLIST_ITEM *pxPrevious;
	void *pvOwner;
	void *pvContainer;
};	
typedef struct xLIST_ITEM ListItem_t;


struct xMINI_LIST_ITEM
{
	TickType_t xItemValue;
	struct xLIST_ITEM *pxNext;
	struct xLIST_ITEM *pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;

typedef struct xLIST
{
	UBaseType_t uxNumberOfItem;
	ListItem_t *pxIndex;
	MiniListItem_t xListEnd;
}List_t;
